﻿#include<iostream>
using namespace std;

//class Person
//{
//public:
//	void Print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
////protected:
//	string _name = "peter"; // 姓名
//	int _age = 18;  // 年龄
//};
//
//// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。使用监视窗口查看Student和Teacher对象，可以看到变量的复用。调用Print可以看到成员函数的复用。
//class Student : public Person
//{
//protected:
//	int _stuid; // 学号
//};
//
//class Teacher : public Person
//{
//protected:
//	int _jobid; // 工号
//};
//
//int main()
//{
//	int i = 0;
//	// double d = i;
////	double& d = i;
//	const double& d = i;
//
//	Person p;
//	Student s;
//
//	// 赋值兼容转换(切割，切片)
//	//p = s;
//	Person& rp = s;
//	rp._name = "张三";
//	Person p1 = s;
//
//	Person* ptrp = &s;
//	ptrp->_name = "李四";
//
//	//s = (Student)p;
//
//	return 0;
//}



//class Person
//{
//public:
//	void fun()
//	{
//		cout << "Person::func()" << endl;
//	}
//
//protected:
//	string _name = "小李子"; // 姓名
//	int _num = 111; 	   // 身份证号
//};
//
//// 隐藏/重定义：子类和父类有同名成员，子类的成员隐藏了父类的成员
//class Student : public Person
//{
//public:
//	void fun()
//	{
//		cout << "Student::func()" << endl;
//	}
//
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << _num << endl;
//		cout << Person::_num << endl;
//	}
//protected:
//	int _num = 999; // 学号
//};
//
//int main()
//{
//	Student s;
//	s.Print();
//	s.fun();
//	s.Person::fun();
//
//	return 0;
//}




 //两个fun构成什么关系？
 //a、隐藏/重定义   b、重载   c、重写/覆盖  d、编译报错
 //答案：a  (父子类域中，成员函数名相同就构成隐藏)
//class Person
//{
//public:
//	void fun()
//	{
//		cout << "Person::func()" << endl;
//	}
//
//protected:
//	string _name = "小李子"; // 姓名
//	int _num = 111; 	   // 身份证号
//};
//
// //隐藏/重定义：子类和父类有同名成员，子类的成员隐藏了父类的成员
//class Student : public Person
//{
//public:
//	void fun(int i)
//	{
//		cout << "Student::func()" << endl;
//	}
//
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << _num << endl;
//		cout << Person::_num << endl;
//	}
//protected:
//	int _num = 999; // 学号
//};
//
//int main()
//{
//	Student s;
//	s.Person::fun();
//	s.fun(1);
//
//	return 0;
//}

//
// 
// 
//class Person
//{
//public:
//	Person(const char* name = "peter")
//		: _name(name)
//	{
//		cout << "Person()" << endl;
//	}
//
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//
//		return *this;
//	}
//
//	~Person()
//	{
//		cout << "~Person()" << endl;
//		delete _pstr;
//	}
//protected:
//	string _name; // 姓名
//
//	string* _pstr = new string("111111111");
//};
//
// 
// 
//class Student : public Person
//{
//public:
//	// 先父后子
//	Student(const char* name = "张三", int id = 0)
//		:_id(0),Person(name)
//	{}
//		Student(const Student& s)
//			:_id(s._id),Person(s)
//		{}
//			Student& operator=(const Student& s)
//	{
//		if (this != &s)
//		{
//			Person::operator=(s);
//			_id = s._id;
//		}
//
//		return *this;
//	}
//	~Student()
//	{
//		// 由于后面多态的原因(具体后面讲)，析构函数的函数名被
//		// 特殊处理了，统一处理成destructor
//
//		// 显示调用父类析构，无法保证先子后父
//		// 所以子类析构函数完成就，自定调用父类析构，这样就保证了先子后父
//		//Person::~Person();
//
//		cout << *_pstr << endl;
//		delete _ptr;
//	}
//protected:
//	int _id;
//	int* _ptr = new int;
//};
//
//int main()
//{
//	Student s1;
//	Student s2(s1);
//	Student s3("李四", 1);
//	s1 = s3;
//	return 0;
//}
// 
// 
// 
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//
//class Student : public Person
//{
//	friend void Display(const Person& p, const Student& s);
//protected:
//	int _stuNum; // 学号
//};
//
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	cout << s._stuNum << endl;
//}
//
//void main()
//{
//	Person p;
//	Student s;
//	Display(p, s);
//}
// 
// 
// 
// 静态成员属于父类和派生类
//// 在派生类中不会单独拷贝一份，继承的使用权
//class Person
//{
//public:
//	Person() { ++_count; }
////protected:
//	string _name; // 姓名
//public:
//	static int _count; // 统计人的个数。
//};
//
//int Person::_count = 0;
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//class Graduate : public Student
//{
//protected:
//	string _seminarCourse; // 研究科目
//
//};
//
//int main()
//{
//	Person p;
//	Student s1;
//	Student s2;
//
//	cout << Person::_count << endl;
//
//	/*cout << &p._name << endl;
//	cout << &s._name << endl;
//
//	cout << &p._count<< endl;
//	cout << &s._count << endl;
//
//	cout << &Person::_count << endl;
//	cout << &Student::_count << endl;*/
//
//	return 0;
//}
// 
// 
// 
//class Person
//{
//public:
//	string _name; // 姓名
//	int _age;
//};
//
//class Student : virtual public Person
//{
//protected:
//	int _num; //学号
//};
//
//class Teacher : virtual public Person
//{
//protected:
//	int _id; // 职工编号
//};
//
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程
//};
//int main()
//{
//	Assistant as;
//	as.Student::_age = 19;
//	as.Teacher::_age = 30;
//	as.Person::_age = 38;
//	return 0;
//}
//

//class A
//{
//public:
//	int _a[128];
//};
//
//class B :  public A
//{
//public:
//	int _b;
//};
//
//class C :  public A
//{
//public:
//	int _c;
//};
//
//class D : public B, public C
//{
//public:
//	int _d;
//};
//int main()
//{
//	D d;
//
//	B b;
//	b._b = 3;
//	int a=sizeof(d);
//	cout << a;
//	return 0;
//}


//class A
//{
//public:
//	int _a[128];
//};
//
// class B : public A
////class B : virtual public A
//{
//public:
//	int _b;
//};
//
//class C : public A
////class C : virtual public A
//{
//public:
//	int _c;
//};
//
//class D : public B, public C
//{
//public:
//	int _d;
//};
//
//
//
//int main()
//{
//	D d;
//	//d.B::_a = 1;
//	//d.C::_a = 2;
//	d._b = 3;
//	d._c = 4;
//	d._d = 5;
//
//	cout << sizeof(D) << endl;
//
//	return 0;
//}

//class Base1 { public:  int _b1; };
//class Base2 { public:  int _b2; };
//class Derive : public Base2, public Base1 { public: int _d; };
//
//int main() {
//	Derive d;
//	Base1* p1 = &d;
//	Base2* p2 = &d;
//	Derive* p3 = &d;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class A {
//public:
//	A(const char* s) { cout << s << endl; }
//	~A() {}
//};
//
//class B :virtual public A
//{
//public:
//	B(const char* sa, const char* sb) : { cout << sb << endl; }
//};
//
//class C :virtual public A
//{
//public:
//	C(const char* sa, const char* sb) :A(sa) { cout << sb << endl; }
//};
//
//class D :public B, public C
//{
//public:
//	D(const char* sa, const char* sb, const char* sc, const char* sd) 
//		:B(sa, sb), C(sa, sc), A(sa)
//	{
//		cout << sd << endl;
//	}
//};
//
//int main() {
//	D* p = new D("class A", "class B", "class C", "class D");
//	delete p;
//
//	//B b("class A", "class B");
//
//	return 0;
//}


//class C
//{
//	//....
//};
//
//// 继承
//class D : public C
//{};
//
//// 组合
//class E
//{
//private:
//	C _cc;
//};

